/***************************************************************************
 *            relatorio.h
 *
 *  Tue May 24 16:17:14 2011
 *  Copyright  2011  Alcione Ferreira
 *  <alcione.sombra@gmail.com>
 ****************************************************************************/

#include <bibliotecas.h>

#ifndef __RELATORIO_H__
#define __RELATORIO_H__ 1 

#include <pdf-new.h>

/** Classe Template COLUNASR 
 ela reimplementa a classe Gtk::TreeModel::ColumnRecord e é utilizada para 
 TreeView e EntryCompletion.
 */
class COLUNASRT : public Gtk::TreeModel::ColumnRecord
	{
	public : 
		/**Construtor da Classe*/
		COLUNASRT ();
		/**Destrutor da Classe*/
		~COLUNASRT ();
		Gtk::TreeModelColumn<int> cod_servico;/**<Armazena código do serviço*/
		Gtk::TreeModelColumn<int> cod_funcionario;/**<Armazena código do funcionario*/
		Gtk::TreeModelColumn<int> cod_cliente;/**<Armazena código do cliente*/
		Gtk::TreeModelColumn<Glib::ustring> descricao; /**<Armazena campo ustring para apresentação em EntryCompletion e ComboBoxText*/
		Gtk::TreeModelColumn<Glib::ustring> campo[3];/**<*/

	private:
		int n_campos;/**<Campo contador de armazenamento para apresentação*/		
	};
/**
 * Classe responsável por gerar os relatórios do sistema de Caixa.
 */
class RELATORIO
	{
	public:
		/**Construtor da Classe*/
		RELATORIO(BANCOPG *,int,int);
		 /**Destrutor da Classe*/
		~RELATORIO();
		Gtk::Window *WRelat; /**<Janela Utilizada para gerar relatório dos recibos.*/
		Gtk::Window *J_Clientes;
		/**Método utilizado para carregar janela de relatórios*/
		void janela();
		string data_relatorio[2];/**<String utilizada para armazenar intevalo ou datas para relatórios.*/
		bool caixa;/**<*/

	protected:
		COLUNASRT arvore_reg; /**<Estrutura de armazenamento*/
		Glib::RefPtr<Gtk::ListStore> dados_serv; /**<Ponteiro especial para utilização de estrurura de armazenamento.*/
		Glib::RefPtr<Gtk::ListStore> dados_fun; /**<Ponteiro especial para utilização de estrurura de armazenamento.*/
		Glib::RefPtr<Gtk::ListStore> dados_cli; /**<Ponteiro especial para utilização de estrurura de armazenamento.*/
		Glib::RefPtr<Gtk::ListStore> dados_ccli; /**<Ponteiro especial para utilização de estrurura de armazenamento.*/
		Gtk::TreeModel::Row celula; /**<Gtk::TreeModel::Row utilizado na inclusão de dados em TreeView.*/
		/**Método utilizado para carregar as informações do usuário que solicitou o relatório.*/
		void carregar_usuario();
		/**Método utilizado para fechar janelas abertas.*/
		void sair();
		/**Método utilizado para checagem */
		void checagem (int);
		Gtk::Entry *Data_INI;/**<Gtk::Entry utilizada para armazenar ou ser digitada data inicial de período.*/
		Gtk::Entry *Data_FIM;/**<Gtk::Entry utilizada para armazenar ou ser digitada data final de período.*/
		Gtk::Entry *Cod_Servico;/**<Gtk::Entry utilizada para digitar/mostrar código de serviço a ser selecionado.*/
		Gtk::Entry *Desc_Servico;/**<Gtk::Entry utilizada para digitar/mostrar descrição de serviço a ser selecionado.*/
		Glib::RefPtr<Gtk::EntryCompletion> Servico_List; /**<Ponteiro especial para autocompletar dados de serviços.*/
		Gtk::Entry *Cod_Funcionario;/**<Gtk::Entry utilizada para digitar/mostrar código do funcionário a ser selecionado.*/
		Gtk::Entry *Desc_Funcionario;/**<Gtk::Entry utilizada para digitar/mostrar descrição do funcionário a ser selecionado.*/
		Glib::RefPtr<Gtk::EntryCompletion> Funcionario_List; /**<Ponteiro especial para autocompletar dados dos funcionários.*/
		Gtk::Button *OK;/**<Gtk::Button com função de positivação de ação.*/
		Gtk::Button *Cancel;/**<Gtk::Button com função de cancelamento de ação. */
		Gtk::Entry *Cod_Cliente;/*Gtk::Entry utilizada para digitar/mostrar código do cliente.*/
		Gtk::Entry *Nome_Cliente;/*Gtk::Entry utilizada para digitar/mostrar nome do cliente.*/
		Glib::RefPtr<Gtk::EntryCompletion> Client_List; /**<Ponteiro especial para autocompletar dados de clientes.*/
		Gtk::RadioButton *Credito;/**Gtk::RadioButton utilizada para selecionar entre Débito e Crédito*/
		/** Método utilizado para mudar o cursos de posição em uma Entry. */
		void set_posicao(Gtk::Entry * , int );
		/** Método utilizado para passar de um Gtk::Widget para outro.*/
		void tabular(Gtk::Window*, Gtk::Widget*);
		/** Método utilizado para aceitar e converter letras para maiúsculo em Entrys. */
		void letra(Gtk::Entry *);
		/** Método utilizado para aceitar apenas dígitos em Entrys. */
		void digito(Gtk::Entry *, int);

		Gtk::ScrolledWindow *CS_Cliente;/**<Gtk::ScrolledWindow do PRINCIPAL::CT_Cliente.*/
		Gtk::TreeView *CT_Cliente;/**<Gtk::TreeView da tela PRINCIPAL::Cliente.*/

		Gtk::CheckButton *Detalhe;

	private:
		int pos_entry;/**<Atributo que guarda a posição inicial de um texto de Entry.*/
		int entry_ativa;/**<Atributo que informa qual entry está ativa.*/
		BANCOPG *conexao;/**<Ponteiro para conecção com banco de dados.*/
		int tipo_relatorio;/**<Atributo utilizado para armazenar o tipo de relatório solicitado.*/
		int cod_fun; /**<Atributo utilizado para armazenar o código do usuário que acessou o sistema.*/
		int n_acesso; /**<Atributo utilizado para armazenar o nível de acesso do usuário que acessou o sistema.*/
		string n_func; /**<Atributo utilizado para armazenar o nome do usuário que acessou o sistema.*/
		string n_login; /**<Atributo utilizado para armazenar o login do usuário que acessou o sistema.*/
		string data_sel[2]; /**<Atributo do tipo vetor utilizado para armazenar as datas selecionadas.*/
		Glib::RefPtr<Gdk::Pixbuf> ponteiro_icon;/**<Ponteiro especial utilizado para carregar ícone das janelas de relatórios.*/
		string codigo_sersel; /**<Atributo utilizado para armazenar o código do serviço selecionado para o relatório.*/
		string codigo_funsel; /**<Atributo utilizado para armazenar o código do funcionario selecionado para o relatório.*/
		string codigo_clisel; /**<Atributo utilizado para armazenar o código do cliente selecionado para o relatório.*/
		/** Método utilizado para carregar dados*/
		void preparar_dados (int);
		/** Método utilizado para checar o cadastro de um determinado serviço.*/
		void checar_servico(Gtk::Window *, Gtk::Entry *, int);
		/** Método utilizado para checar o cadastro de um determinado funcionario.*/
		void checar_funcionario(Gtk::Window *, Gtk::Entry *, int);
		/** Método utilizado para checar o cadastro de um determinado cliente.*/
		void checar_cliente(Gtk::Window *, Gtk::Entry *, int);
		/** Método utilizado para chamar a classe PDFNEW para geração de relatório em PDF*/
		void imprimir();
		/** Método utilizado para selecionar um cliente pelo nome ou código */
		void clientes_credito();
		/** Método utilizado para selecionar um cliente pelo nome ou código */
		void carregar_clientes(Gtk::Entry *);
		/** Método utilizado para selecionar um cliente pelo nome ou código */
		void cli_sel(const Gtk::TreeModel::Path& , Gtk::TreeViewColumn* );

	};

#endif /*__RELATORIO_H__*/